package io;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

/**
 * InputStream
 * 抽象类，为各种输入字节流的基类（超类）
 * 实现Closeable接口，在try...catch语句中，在try后边的小括号中引用或生成对象时即可实现在退出try...catch语句时自动关闭流
 *
 * public abstract int read() throws IOException                读取一个字节，读到末尾时返回 -1
 *
 * public int read(byte b[])throws IOException                  读取一个数据块，返回实际读取的字节数
 *
 * public int read(byte b[],int off,int len)throws IOException  最多读取len个字节并存放到字节数组b的off位置开始
 *                                                              返回实际读取的字节数
 *
 * public long skip(long n)throws IOException           跳跃n个字节，返回实际跳跃的字节数
 *
 * public int available()throws IOException     返回可以从此输入流读取(或跳过)而不会被此输入流的方法的下一次调用阻塞的字节数的估计
 *
 * public void close()throws IOException{}              关闭此输入流并释放与该流关联的任何系统资源
 *
 * public synchronized void mark(int readlimit)         标记此输入流中的当前位置
 *                              对reset方法的后续调用将此流重新定位到最后标记的位置，以便后续读取重新读取相同的字节
 *
 * public synchronized void reset()throws IOException   将此流重新定位到该输入流上一次调用mark方法时的位置
 *
 * public boolean markSupported()                       测试此输入流是否支持标记和重置方法
 * */
public class InputStreamDemo {
    public static void main(String[] args) throws IOException {
        test1();
        test2();
    }
    private static void test1() throws IOException {
        InputStream in = new FileInputStream("files/demo.txt");
        int b = in.read();
        System.out.println(b);
        b = in.read();
        System.out.println((char) b);
        b = in.read();
        System.out.println(b);
        byte[] bytes = new byte[1024];
        if ((b = in.read(bytes)) != -1)
            System.out.println(Arrays.toString(bytes).substring(0, b));
        in.close();
        in = new FileInputStream("files/demo.txt");
        if ((b = in.read(bytes, 0, b)) != -1)
            System.out.println(Arrays.toString(bytes).substring(0, b));
        in.close();
        in = new FileInputStream("files/demo.txt");
        if ((b = in.read(bytes, 3, b)) != -1)
            System.out.println(Arrays.toString(bytes).substring(0, b + 4));
        in.close();
    }

    // 读取.java文件并打印到控制台
    private static void test2() {
        System.out.print("\n\n-------------------------------------");
        System.out.println("-------------------------------------\n");
        File[] files = new File("src/io").listFiles(f -> f.getName().endsWith(".java"));
        for (File file : files) {
            try (InputStream in = new FileInputStream(file)) {
                byte[] buffer = new byte[(int)file.length()];
                in.read(buffer);
//                String str = new String(buffer);
                String str = new String(buffer, StandardCharsets.UTF_8);
                System.out.print(str);
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.print("\n\n-------------------------------------");
            System.out.println("-------------------------------------\n");
        }
    }
}
